/**
 * @brief   : 常用数学工具
 * @version : 0.1
 * @author  : wanghuan
 * @date    : 2024.10.28
 * @copyright Copyright (c) 2024 by 神工仿真, All Rights Reserved.
 */

#ifndef Algebra_Tools_h
#define Algebra_Tools_h

#include "AlgebraModule.h"
#include "Point.h"

SG_NAMESPACE_OPEN

namespace Algebra
{
    /**
     * @brief   计算平面三角形面积。并返回法线方向 
     * 
     * @param    vertices 平面三角形坐标，维度3*2 [x1 y1; x2, y2; x3, y3]
     * @param    normal 
     * @return   
     * @date     2024.12.29
     */
    ALGEBRA_EXPORT Real_t calc2DTriArea (const Matrix& vertices, Vector3D& _OUT normal);

    /**
     * @brief      : 计算三角形面积
     * @param      : point1
     * @param      : point2
     * @param      : point3
     * @param[out] : normal
     * @return     : 面积
     * @date       : 2024.10.28
     */
    ALGEBRA_EXPORT Real_t calcTriArea (const Point& point1, const Point& point2, const Point& point3, Vector3D& _OUT normal);

    /**
     * @brief      : 计算三角形面积
     * @param      : 顶点坐标矩阵
     * @param[out] : normal
     * @return     : 面积
     * @date       : 2024.12.11
     */
    ALGEBRA_EXPORT Real_t calcTriArea (const Matrix& vertices, Vector3D& _OUT normal);

    /**
     * @brief      : 计算四面体体积
     * @param      : 顶点坐标矩阵
     * @return     : 体积
     * @date       : 2024.11.22
     */
    ALGEBRA_EXPORT Real_t calcTetraVolumn (const Matrix& vertices);

    /**
     * @brief      : 计算四面体体积
     * @param      : point1
     * @param      : point2
     * @param      : point3
     * @param      : point4
     * @return     : 体积
     * @date       : 2024.11.22
     */
    ALGEBRA_EXPORT Real_t calcTetraVolumn (const Point& point1, const Point& point2, const Point& point3, const Point& point4);

};  // end namespace Algebra

SG_NAMESPACE_CLOSE

#endif  // Algebra_Tools_h
